package com.example.demo.Utils.JWTUtils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class JWTUtils {

    /**
     * 签名密钥
     */
    private static final String SING = "WUDUXIAOZHAN";

    /**
     * 存储被标记为无效的 Token 的黑名单
     */
    private static final Set<String> BLACKLIST = new HashSet<>();

    /**
     * 生成 token
     */
    public static String getToken(Map<String, String> map) {
        Calendar instance = Calendar.getInstance();
        // 默认7天过期
        instance.add(Calendar.DATE, 7);

        // 创建 JWT Builder
        JWTCreator.Builder builder = JWT.create();

        // 设置 payload
        map.forEach(builder::withClaim);

        return builder.withExpiresAt(instance.getTime())  // 指定令牌过期时间
                .sign(Algorithm.HMAC256(SING));
    }

    /**
     * 验证 token 的合法性，同时检查是否在黑名单中
     */
    public static DecodedJWT verify(String token) throws RuntimeException {
        // 检查 token 是否在黑名单中
        if (BLACKLIST.contains(token)) {
            throw new RuntimeException("Token 已无效！");
        }

        // 验证 Token 的签名
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

    /**
     * 将指定的 Token 添加到黑名单，使其过期
     */
    public static void invalidateToken(String token) {
        BLACKLIST.add(token);
    }

    /**
     * 从 Token 中提取用户 ID
     */
    public static String getUserIDFromToken(String token) {
        DecodedJWT decodedJWT = verify(token);
        return decodedJWT.getClaim("id").asString();
    }

    /**
     * 从 Token 中提取用户角色
     */
    public static String getUserRoleFromToken(String token) {
        DecodedJWT decodedJWT = verify(token);
        return decodedJWT.getClaim("role").asString();
    }

    /**
     * 检查 Token 是否已无效（被加入到黑名单中）
     */
    public static boolean isTokenInvalidated(String token) {
        return BLACKLIST.contains(token);
    }
}